Cosenseのweb dynoのメモリ使用量が爆発してるけどなぜかなんともない
https://gyazo.com/a58dbf0cd9397e8e8efce639338c2a28
totalが2GBを超えた場合、すぐにギリギリ2GB以内に戻る
swapが1GBを超えた場合も、すぐにギリギリ1GB以内に戻る
継続的にR14 - Memory Quota Exceededが発生している
https://scrapbox.io/files/69256f22c4cc10dbbb4c65d4.png
たまにR15 - Memory Quota Vastly Exceededが発生する
https://nota.slack.com/archives/C01R3LZ6SSZ/p1761617560786359 などでも報告しているが
昔からたまにこういう事はあった
nodeが自身のメモリ使用量を環境に合わせて自己判断するのは、Node.js v12から入った仕様である
Node.js v12はheap out of memoryエラーがすぐ出る
Scrapboxの--max-old-space-sizeを1024から指定無しに変更したい
NodeとHerokuのどっちかの実装が原因で、うまく動いてない時期もあった
Node 20はHerokuの共有環境のメモリ制限をうまく解釈できていないっぽいという話もある
つまりheroku側の仮想環境がOSのレイヤーを通してプロセスに提供している情報が間違っている?
いや、そんな事はない気がするなshokai.icon
total 2GBやswap 1GBを超えたらすぐギリギリに収まる挙動は、nodeがサーバー環境の持つリソースを見て調整しているようにしか思えない。heroku側が収めているのではなく。
この挙動は偶然だと思われる
Herokuは悪くない。node側の実装が悪い
Node.jsはHeroku dynoに搭載されているメモリ量を誤認している
メモリ容量オーバーしてるのにkillされない理由
今、HerokuのインフラがFir世代に移行しようとしているのも関係している気がするshokai.icon
R14 - Memory Quota ExceededやR15 - Memory Quota Vastly ExceededはFirには存在しない
https://devcenter.heroku.com/articles/error-codes#r14-memory-quota-exceeded より
R14 errors aren’t currently emitted for Fir-generation apps.
間違ってCedar世代でもR14が処理されなくなっているのではないか?shokai.icon
今後処理されるようになったら事故起こりそうだな
HerokuでCluster modeのnode.jsプロセスを起動するとそれぞれがメモリを手加減なしに使おうとするので--max-old-space-sizeの指定が必須って事じゃないかと思っているshokai.icon
そういうわけではない事が
環境変数CLUSTER_WORKER_NODE_OPTIONSに--max-old-space-size=512を設定した後の経過観察
環境変数SERVER_NODE_OPTIONSに--max-old-space-size=100を設定した後の経過観察
でわかった
scrapbox.ioのみ時間経過でメモリ使用量が増加する原因を、Codex CLIとともに探る
これでかなり解決したshokai.icon*10
2025/11/11(月)の夜中の修正が効いてる
どうやら、単にメモリ使用量が多いだけの、リークはしていないwebアプリになった
あとできるのはメモリ使用量が多い処理をどうにかする事ぐらい
RSS出力はクソデカXMLを作る可能性がある
2025/11/13(木) の朝と夜の2回改善リリースした
2025/11/13 20:44
7日間のメモリ使用量
https://scrapbox.io/files/692581e6f46c96357475d15a.png
72時間のメモリ使用量
https://scrapbox.io/files/692581e860635b05fed4045a.png
明け方のRSSのサイズ縮小がちょっと効いてるのかもしれないなshokai.icon
2025/11/14 18:38
72時間のメモリ使用量
https://scrapbox.io/files/692581ec335e7276c05190a2.png
やはりb37c8fd5でリリースしたRSSサイズ縮小が効いてそうshokai.icon
2025/11/14(金) 15:29
とりあえずメモリリークは無くなったと考えていますshokai.icon
今は、ただのちょっとメモリ使用量が多いだけのアプリになった
検証
長時間リスタートせずに動かし続けた
リクエストが少ない時間帯に、メモリ使用量が変化しない
リクエストが多い時間帯は、メモリ使用量とリクエスト数が連動する
https://gyazo.com/7bc8967e8aa520c17136e7b2959e947f
サーバーが再起動するとメモリ使用量がリセットされる
リクエストが少ない時間帯に時間経過でどんどんメモリ使用量が増える事がなくなった
リクエストが増えると、それに伴ってメモリ使用量も増える
結局何が一番大きな原因だったのか?
たぶんresponseを返す前にclient側から切断された場合、graceful shutdown timer内にrequest & response objectが残り続ける
だけど手当たり次第直してしまったので、他にも同等のものが存在したかもしれない
他はログ読んでくれ。本当に色々やったので
でもたぶんこれshokai.icon
なぜgraceful shutdownが今更問題になったか?
5年ぐらい前に実装した機能である
今更すぎる
説1:この1年ぐらいで、Helpfeel専用Cosense Export APIの利用数がどんどん増えた
bug自体は5年前からあった
5年かけてようやく問題になるレベルで顕在化したのではないか?
説2:最近のライブラリアップデートでexpress等のライブラリの仕様が変わった
ここ半年でほとんどのライブラリが最新版になった。そのせい
AIの登場ですごい勢いでのライブラリ更新が可能となった
ライブラリ更新レビュー手順書など
今後できる事は、メモリ使用量を減らすだけ
リークしてないので。単に効率を良くする
別で進めているAPI分割をリリースしようshokai.icon